package cn.tedu.justone.pack02;

/**
 * @作者：JustOne
 * @时间：2021/8/29 - 9:36
 */
public class Demo10_0_synchronized让方法互斥 {
    public static void main(String[] args) {
        //synchronized让方法互斥
        //synchronized让方法互斥
        //synchronized让方法互斥
        // 使用synchronized锁定对多个方法(代码片段)并使用同一个监视对象，
        // 那么这多个方法就不能同时执行，有我没你，形成互斥

        //示例思路：
        //1,马云在银行有1000元余额，他约朋友跟自己分工合作，
        //  一个人在柜台取钱，一个人在ATM取钱，看看会发生什么？
        //2,当两个方法不加锁时，是会出现线程安全问题.
        //3,当两个方法都加锁时，他们的锁对象都是当前实例，形成互斥。
        //

        Bank ICBC = new Bank();
        Thread jack = new Thread(){
            @Override
            public void run() {
                ICBC.atm(1000);
            }
        };
        Thread tony = new Thread(){
            @Override
            public void run() {
                ICBC.window(1000);
            }
        };

        jack.start();
        tony.start();
    }
}

class Bank{
    static int money = 1000;

    //柜台取钱
    public synchronized void window(int num){
        if(num<= money){
            mySleep(1000);
            money -= num;
            System.out.println("在柜台取走了"+num+",余额"+money);
        }
    }
    //ATM取钱
    public synchronized void atm(int num){
        if(num<= money){
            mySleep(1000);
            money -= num;
            System.out.println("在ATM取走了"+num+",余额"+money);
        }
    }

    //为了让代码更优雅，编写统一的休眠方法
    public static void mySleep(long m){
        try {
            Thread.sleep(m);
        } catch (InterruptedException e) {
            System.out.println("You：谁喊我？");
            e.printStackTrace();
        }
    }

}
